10836. Лето
Бруно и его друзья играют с
водяными пистолетами. Они страстные геймеры, поэтому это не обычная игра с
водяным пистолетом, а на самом деле очень похожая на видеоигру. Они даже наняли
модератора для игры.
В начале игры игроки делятся на
две команды: “ананас” и “черника”. Во время игры модератор отслеживает моменты времени, когда какой-то игрок
совершает выстрел в другого игрока. Как и в видеоиграх, игроки получают очки.
Когда игрок из какой-либо команды стреляет в кого-то из противоположной команды,
его команда получает 100 очков.
Однако, если в течение 10 секунд тот
же игрок снова выстрелит в кого-нибудь из противоположной команды, то это
засчитывается как двойной выстрел, и его команда получает дополнительные 50 очков. Игрок может выполнить несколько двойных
выстрелов подряд, каждое из которых принесет его команде дополнительные 50 очков.
Вход. Первая строка содержит количество выстрелов n (1 ≤ n ≤ 100) во время игры.
Каждая из следующих n строк содержит три целых числа ti,
ai, bi (0 ≤ ti ≤
1000, 1 ≤ ai, bi ≤ 8) указывающих на то что игрок ai совершил выстрел в игрока bi в момент времени ti (в секундах).
Игроки из команды “ананас” пронумерованы натуральными числами от
1 до 4. Номера игроков из команды “черника” пронумерованы натуральными числами от
5 до 8. Игроки ai и bi гарантированно принадлежат к разным командам.
Числа ti различны и упорядочены по
возрастанию.
Выход. В одной строке выведите два числа: общий результат
команды “ананас” и общий счет команды “черника”.
Пример
входа 1 |
Пример
выхода 1 |
3 10 1 6 20 1 7 21 8 1 |
250 100 |
|
|
Пример
входа 2 |
Пример
выхода 2 |
3 10 2 5 15 2 6 25 2 5 |
400 0 |
|
|
Пример
входа 3 |
Пример
выхода 3 |
2 10 5 2 11 6 3 |
0 200 |
математика
Для каждого игрока (их у нас 8) будем хранить инфомацию о времени
их последнего выстрела. Например, в prevTime[i] будем хранить время в секундах последнего выстрела
игрока i.
Последовательно
обрабатываем n выстрелов. Пусть текущий выстрел представлен тройкой t,
a, b. Тогда:
·
При совершении выстрела команде игрока a начисляется 100
очков;
·
Если игрок a делает двойной выстрел (t – prevTime[a] ≤ 10), то команде игрока a начисляется 50
очков;
·
Присваиваем prevTime[a] = t, игрок a совершил свой последний выстрел в момент
времени t;
Пример
В первом примере на секундах 10 и 20 игрок 1 совершает выстрел в игроков 6 и 7 из другой команды. За каждый
выстрел ананас получает 100 очков.
Поскольку оба выстрела произошли в течение
10 секунд, команда получила дополнительно
50 очков (250 = 2 ⋅ 100 + 50).
Команда черника выстрелила только в одного игрока из команды
соперника, поэтому набрала всего 100 очков.
Во втором примере игрок 2 выполнил два двойных выстрела подряд, поэтому команда
ананас получила в сумме 3 ⋅ 100 + 2 ⋅ 50 = 400 очков.
Реализация алгоритма
В prevTime[i]
будем хранить
время в секундах последнего выстрела игрока i.
int prevTime[10];
Читаем
количество выстрелов n.
scanf("%d", &n);
Для
каждого игрока время последнего выстрела изначально устанавливаем равным -∞.
for (i = 1; i < 10; i++)
prevTime[i] = -10000;
Результаты команд “ананас” и “черника” подсчитываем в переменных pa и pb.
pa = pb =
0;
Обрабатываем
n выстрелов.
while (n--)
{
Игрок a совершает
выстрел в игрока b в момент времени t.
scanf("%d %d %d", &t, &a, &b);
Команде,
которая произвела выстрел, начисляется 100 очков.
if (a < b) pa += 100;
else pb += 100;
Если
игрок a совершает выстрел в течение 10 секунд, то соответствующая команда
получает 50 бонусных очков.
if (t - prevTime[a] <=
10)
if (a < b) pa += 50;
else pb += 50;
Заносим
информацию о том что игрок a совершил выстрел в момент времени t.
prevTime[a] = t;
}
Выводим ответ.
printf("%d %d\n", pa, pb);